package com.letoken.platform.repo.web3.provider;

import com.letoken.platform.pub.res.web3.ResultTransaction;
import com.letoken.platform.pub.res.token.TokenErc20TxRes;
import com.letoken.platform.pub.res.token.TokenTxRes;
import com.letoken.platform.repo.wallet.po.Web3ChainProvider;
import org.springframework.stereotype.Component;
import org.web3j.protocol.Web3j;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

/**
 * @author letokenlabs
 * @date 2022/12/14$
 */
@Component
public interface IEvmProvider {

    Web3ChainProvider getWeb3ChainProvider();

    /**
     * 获取转账Gas限制 gwei
     * @return
     */
    String getGasLimit();

    /**
     *  获取Web3j链接对象
     *  如果这个地址不知道怎么获取 可以参考  https://blog.csdn.net/sail331x/article/details/115395131
     * @return
     */
    Web3j getWeb3j();

    /**
     *  获取最新区块高度
     *  结果缓存到redis（24小时失效更新）
     * @return
     */
    long blockHeight();

    /**
     * 获取GasPrice
     * 结果缓存到redis（1小时失效更新）
     * @return wei
     */
    BigInteger gasPrice();

    /**
     * 获取钱包余额（navite）
     * @param address 用户钱包地址
     * @return wei
     */
    String balance(String address);

    /**
     * 获取钱包代币余额（erc20)
     * @param contractAddress 代币合约地址
     * @param address 用户钱包地址
     * @return wei
     */
    String tokenBalance(String contractAddress, String address);

    /**
     * 发送原生代币
     * @param privateKey 钱包秘钥
     * @param toAddress 收款钱包地址
     * @param value 转账数量(wei)
     * @return txHash
     * @throws Exception
     */
    String transfer(String privateKey, String toAddress, BigDecimal value) throws Exception;

    /**
     * 发送ERC20代币
     * @param contractAddress 代币合约地址
     * @param privateKey 私钥
     * @param toAddress 收款地址
     * @param value 数量(wei)
     * @return txHash
     */
    String transferToken(String contractAddress, String privateKey, String toAddress, BigDecimal value);

    /**
     * 查询交易状态
     * @param txHash
     * @return 空-不存在 0失败 1成功
     */
    String getTxReceiptstatus(String txHash);

    /**
     * 获取ERC20代币交易记录
     * @param contractAddress
     * @param walletAddress
     * @param page
     * @param pageSize
     * @param sort
     * @return
     */
    List<TokenErc20TxRes> getTokenErc20Txs(String contractAddress, String walletAddress, Integer page, Integer pageSize, String sort);

    /**
     * 获取原生代币交易记录
     * @param walletAddress
     * @param page
     * @param pageSize
     * @param sort
     * @return
     */
    List<TokenTxRes> getTokenTxs(String walletAddress, Integer page, Integer pageSize, String sort);

    List<ResultTransaction> getBlockTokenTransactions(String tokenAddress, String blockNumber);

    List<ResultTransaction> getBlockTokenTransactionsByMoralis(String tokenAddress, String blockNumber);

    ResultTransaction getTransactionByHash(String txHash);
}
